AWS Tools for PowerShell の AWS STS リクエストでハマった話

AWS Tools for PowerShell の AWS STS リクエストでハマった話

Clock Icon2024.07.31

こんにちは。テクニカルサポートチームのShiinaです。

はじめに

一時的に別のロールに AssumeRole して取得したクレディンシャルを利用して S3 など必要サービスにアクセスしたい場合があると思います。
Assume Role によるクレデンシャル取得は AWS Tools for PowerShell でも利用することができます。
クレデンシャル取得方法については以下をご参照ください。
https://dev.classmethod.jp/articles/aws_tool_for_powershell_assume-role-credentials-provider-and-mfa/

Use-STSRole コマンドを利用したところ、リモートサーバーに接続できないエラーでハマってしまいました。。
原因と対処方法についてご紹介します。

前提

  • インターネットへのルートがないプライベートサブネット上で EC2 インスタンスを利用している。
  • STS サービスの VPC エンドポイントを利用している。

困っていた事象

AWS Tools for PowerShell の Use-STSRole コマンドを利用したところ、次のエラーメッセージが返されました。

PS C:\Users\Administrator> Use-STSRole -RoleSessionName "s3-access-role" -RoleArn "arn:aws:iam::xxxxxxxxxxxx:role/s3-read-only-role" -Region ap-northeast-1
Use-STSRole : Name resolution failure attempting to reach service in region ap-northeast-1 (as supplied to the -Region
parameter or from configured shell default).
リモート サーバーに接続できません。.
Possible causes:
        - The region may be incorrectly specified (did you specify an availability zone?).
        - The service may not be available in the region.
        - No network connectivity.
See https://docs.aws.amazon.com/general/latest/gr/rande.html for the latest service availability across the AWS regions
.
発生場所:1 文字:1
+ Use-STSRole -RoleSessionName "s3-access-role" -RoleArn "arn:aws:iam:: ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (Amazon.PowerShe...seSTSRoleCmdlet:UseSTSRoleCmdlet) [Use-STSRole]、Inv
    alidOperationException
    + FullyQualifiedErrorId : System.Exception,Amazon.PowerShell.Cmdlets.STS.UseSTSRoleCmdlet

AWS STS のリクエスト通信に失敗したようなメッセージに見えます。

切り分けのため、EC2 インスタンスから東京リージョンに作成した STS サービスの VPC エンドポイントに対する名前解決および TCP のコネクションを確認してみます。

確認には nslookup コマンドと Test-NetConnection コマンドを利用しました。

PS C:\Users\Administrator> nslookup sts.ap-northeast-1.amazonaws.com
サーバー:  ip-10-0-0-2.ap-northeast-1.compute.internal
Address:  10.0.0.2

権限のない回答:
名前:    sts.ap-northeast-1.amazonaws.com
Address:  10.0.2.228

PS C:\Users\Administrator> Test-NetConnection 10.0.2.228 -Port 443

ComputerName     : 10.0.2.228
RemoteAddress    : 10.0.2.228
RemotePort       : 443
InterfaceAlias   : イーサネット 3
SourceAddress    : 10.0.2.223
TcpTestSucceeded : True

東京リージョンに作成したSTSサービスのVPCエンドポイントに対しての通信は問題はなさそうです。

原因

AWS Tools for PowerShell はデフォルトとして AWS STS のリクエストはグローバルエンドポイントである「https://sts.amazonaws.com」に送信されます。

https://docs.aws.amazon.com/ja_jp/sdkref/latest/guide/feature-sts-regionalized-endpoints.html

デフォルトでは、 AWS Security Token Service (AWS STS) はグローバルサービスとして使用でき、 AWS STS すべてのリクエストはの 1 https://sts.amazonaws.com つのエンドポイントに送信されます。

AWS STS のリクエストを東京リージョンのリージョナルエンドポイントである「https://sts.ap-northeast-1.amazonaws.com」に送信するためには、一工夫する必要がありました。

具体的には EndpointUrl パラメータでSTSのエンドポイントURLを指定するか、AWS_STS_REGIONAL_ENDPOINTS 環境変数を利用する必要があります。

やってみた

EndpointUrl パラメータを指定する方法

EndpointUrl パラメータを追加した Use-STSRole コマンドを実行してみます。

PS C:\Users\Administrator> Use-STSRole -RoleSessionName "s3-access-role" -RoleArn "arn:aws:iam::xxxxxxxxxxxx:role/s3-read-only-role" -Region ap-northeast-1 -EndpointUrl "https://sts.ap-northeast-1.amazonaws.com"

AssumedRoleUser                            Credentials                            PackedPolicySize SourceIdentit
                                                                                                   y
---------------                            -----------                            ---------------- -------------
Amazon.SecurityToken.Model.AssumedRoleUser Amazon.SecurityToken.Model.Credentials 0

応答がありました!

AWS_STS_REGIONAL_ENDPOINTS 環境変数を利用する方法

AWS_STS_REGIONAL_ENDPOINTS 環境変数を利用する場合の注意点として、環境変数は他の AWS SDK との互換性があります。
他の AWS SDK を利用している場合は設定が反映されてしまうので、EndpointUrl パラメータを指定する方法をオススメします。

システム環境変数に追加してみます。

Windows のシステムの設定画面にて詳細情報を選択し、システムの詳細設定をクリックします。
1
システムのプロパティの詳細設定タブから環境変数を選択します。
2
システム環境変数側の新規ボタンを選択します。
3
次の変数名と変数値を入力して OK ボタンを選択します。

  • 変数名:AWS_STS_REGIONAL_ENDPOINTS
  • 変数値:regional
    4

EndpointUrl パラメータを含めずに Use-STSRole コマンドを実行してみます。

PS C:\Users\Administrator> Use-STSRole -RoleSessionName "s3-access-role" -RoleArn "arn:aws:iam::xxxxxxxxxxxx:role/s3-read-only-role" -Region ap-northeast-1

AssumedRoleUser                            Credentials                            PackedPolicySize SourceIdentity
---------------                            -----------                            ---------------- --------------
Amazon.SecurityToken.Model.AssumedRoleUser Amazon.SecurityToken.Model.Credentials 0

応答がありました!

まとめ

AWS Tools for PowerShell の Use-STSRole コマンドでハマった件について紹介しました。
AWS STS のリクエストはデフォルトとしてグローバルエンドポイントを利用するため、ご注意ください!

最後までご覧いただきありがとうございました。

本記事が誰かのお役に立てれば幸いです。

参考

https://docs.aws.amazon.com/ja_jp/powershell/latest/userguide/pstools-installing-specifying-region.html

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.